package com.example.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.UUID;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.mapper.UserMapper;
import com.example.model.dto.LoginFormDTO;
import com.example.model.dto.Result;
import com.example.model.entity.User;
import com.example.model.vo.UserVO;
import com.example.service.IUserService;
import com.example.utils.RegexUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.util.Objects;

;

/**
 * @program: backed
 * @author: zk
 * @create: 2023-03-23 19:11
 **/
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
    @Override
    public Result login(LoginFormDTO loginForm, HttpServletRequest request) {
        // 1.校验手机号
        String phone = loginForm.getPhone();
        if (RegexUtils.isPhoneInvalid(phone)) {
            // 2.如果不符合，返回错误信息
            return Result.fail("手机号格式错误！");
        }


        // 4.一致，根据手机号查询用户 select * from tb_user where phone = ?
        User user = query().eq("phone", phone).one();

        // 5.判断用户是否存在
        // 6.不存在
        if (user == null) {
            return Result.fail("用户不存在!");
        }

        // 7.存在，判断密码是否一致
        if (!Objects.equals(user.getPassword(), loginForm.getPassword())) {
            // 不一致，返回错误信息
            return Result.fail("密码错误");
        }

        // 8.用户信息脱敏
        UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);

        // 9.将登录用户的信息存入session
        request.getSession().setAttribute("user", userVO);

        // 10.返回用户数据等
        return Result.ok(userVO);
    }

    @Override
    public Result register(LoginFormDTO loginForm) {
        String phone = loginForm.getPhone();

        // 1.用户是否存在
        User user = query().eq("phone", phone).one();
        // 2.存在
        if (user != null) {
            return Result.fail("用户已存在");
        }
        // 3.不存在 创建用户
        createUserWithPhone(phone, loginForm.getPassword());

        // 4.返回用户信息
        return Result.ok("校验成功");

    }

    private void createUserWithPhone(String phone, String password) {
        String icon = "/imgs/icons/userImg_default.png";
        // 1.创建用户
        User user = new User();
        user.setPhone(phone);
        user.setPassword(password);
        user.setIcon(icon);
        // 2.生成用户名
        String key = phone.substring(phone.length() - 4);
        String username = "buy_" + key;
        user.setUsername(username);

        // 3.生成用户id
        String id = key + "_buy_" + UUID.randomUUID();
        user.setId(id);
        // 4.保存用户
        save(user);
    }

    @Override
    public Result getUserMsg(HttpServletRequest request) {
        // 1.从session中获取用户信息
        UserVO userVO = getLoginUser(request);
        // 2.返回登录用户信息
        return Result.ok(userVO);
    }

    @Override
    public UserVO getLoginUser(HttpServletRequest request) {
        // 1.从session中获取用户信息
        UserVO userVO = (UserVO) request.getSession().getAttribute("user");
        // 2.无当前登录用户信息
        if (userVO == null) {
            throw new RuntimeException("用户未登录");
        }
        // 3.返回登录用户信息
        return userVO;
    }

    @Override
    public Result logout(HttpServletRequest request) {
        request.getSession().removeAttribute("user");
        return Result.ok("退出成功");
    }
}



